package com.dxf.chepter07

/**
 * implicit
 * val num :Int = 3.5 //高精度向低精度 转换错误
 * 高精度向低精度 转换错误 ==> 隐式转换
 * 隐式转换函数 以 implicit关键字声明带有单个参数的函数,这种函数会自动应用,将值从 一个类型转换为另一种类型
 *
 * 注意事项:
 * 1 函数名任意, 和函数签名[xx] 有关  implicit def f1(d: [Double]): [Int]
 * 2 隐式函数可以有多个,但是一种转换方式是唯一的 ,如  double 转 int 的只能是唯一的
 *
 * 隐式函数 专门写一个文件,在import进来
 *
 * ==========================================
 *
 *
 * 隐式值:
 * 也叫隐式变量,将某个形参变量标记为implicit,
 * 编译器会在方法省略隐式参数的情况下,
 * 搜索作用域内的隐式值作为缺省参数
 *
 *==================================================
 *
 *  隐式类 特点
 *  1 构造参数有且只能有一个
 *  2 隐式类必须被定义在 类 伴生对象 或者 包对象 中 ,即 隐式类不能是顶级的
 *  3 隐式类不能是  case class
 *  4 作用域内不能有与之相同名称的标识符
 *
 */
object T78_隐式类 {


  def main(args: Array[String]): Unit = {

    //隐式类
     implicit class DB1 (val m:MYSQL1){
       def add2(): Unit ={
        println("DB1.add")
       }
     }

    val mysql = new MYSQL1
    mysql.add()
    mysql.add2()//这里能联系到是 DB1$1(mysql).add2()  ==> mysql 对象会被传入到class的构造参数中


  }



}

class MYSQL1{
  def add(): Unit ={
    println("MYSQL1.add")
  }
}
